在 Rust 的開發過程中,Cargo 是一個不可或缺的工具,它不僅是 Rust 的建置工具,還是專案管理器和套件管理器。無論是建立新專案、管理依賴、進行測試,還是發佈程式,Cargo 都可以輕鬆處理。本文將帶你深入了解 Cargo 的功能及其在專案中的應用。
Cargo 是 Rust 的官方套件管理和建置工具,與 Rust 編譯器 rustc
共同工作。它負責:
這些功能讓開發者能更專注於程式的開發,而不需要擔心編譯和依賴的管理。
我們從一個簡單的步驟開始:使用 Cargo 建立一個新的 Rust 專案。
首先,開啟終端,然後執行以下命令:
cargo new my_project
這會自動建立一個新的專案目錄 my_project
,並包含以下結構:
my_project
├── Cargo.toml # Cargo 配置文件
└── src
└── main.rs # Rust 代碼入口
在這裡,Cargo.toml
文件是專案的配置文件,而 src/main.rs
則是專案的主要代碼文件。
Cargo.toml
Cargo.toml
是專案的配置文件,包含專案的基本資訊和依賴項目。例如:
[package]
name = "my_project" # 專案名稱
version = "0.1.0" # 專案版本
edition = "2021" # Rust 版本
[dependencies]
在這個文件中,你可以定義專案的依賴關係(dependencies)和其他設定。稍後我們會介紹如何添加依賴。
建立專案後,進入專案目錄並運行以下命令來編譯和執行你的 Rust 專案:
cargo run
這會自動編譯你的專案並運行生成的可執行文件。如果一切正常,你應該會看到:
Hello, world!
Rust 的強大之處在於其社群提供了大量的第三方庫,你可以通過 Cargo 輕鬆添加和管理依賴項目。這些庫都可以在 crates.io(Rust 的官方套件管理網站)上找到。
要在專案中使用第三方庫(crate),只需在 Cargo.toml
中添加依賴項。例如,我們想要使用 serde
來處理 JSON,可以將 serde
添加到 Cargo.toml
:
[dependencies]
serde = "1.0"
serde_json = "1.0"
添加依賴項後,執行 cargo build
或 cargo run
,Cargo 會自動從 crates.io 下載並編譯依賴。所有的依賴會被下載到 Cargo.lock
文件中,這確保了專案在不同環境下依賴版本的一致性。
Cargo 提供了多種指令來幫助開發者進行開發、測試和部署。
cargo build
cargo build
用於編譯專案。如果你只是想編譯但不運行代碼,可以使用這個命令。
cargo build
這會將可執行文件放置在 target/debug
目錄下。
cargo run
cargo run
會編譯並運行專案,這是最常用的開發命令。它可以幫助你在開發過程中快速檢查程式的運行情況。
cargo test
Rust 擁有內建的測試框架,你可以通過 cargo test
來執行專案中的單元測試和集成測試。
cargo test
這會自動查找專案中的測試函數並執行它們。
cargo clean
當你想清理專案生成的二進制文件時,可以使用 cargo clean
。這會刪除 target
目錄下的所有生成文件,讓專案恢復到乾淨狀態。
cargo clean
cargo doc
cargo doc
用於生成專案的文件。Rust 擁有強大的文件系統,可以從代碼自動生成文件。執行 cargo doc --open
後,Cargo 會生成一個 HTML 文件並打開它,讓你瀏覽專案的文件。
cargo doc --open
當專案開發完成並準備發佈時,Cargo 提供了 cargo build --release
來進行優化編譯。這個命令會啟用各種優化選項,生成更快的二進制文件。
cargo build --release
生成的可執行文件會被放置在 target/release
目錄下。
如果你想將專案發佈到 crates.io 並供其他開發者使用,首先需要在 crates.io 註冊帳號,然後使用 cargo publish
將你的包上傳。
cargo publish
發佈前,你需要確保 Cargo.toml
文件中有正確的版本號和描述信息。
Cargo 支援多個專案共用同一個工作空間(workspace),這對於大型專案非常有用。你可以將多個相互依賴的子專案組織在同一個工作空間中。
首先,建立一個新的專案目錄,然後在其中建立一個 Cargo.toml
文件,定義工作空間:
[workspace]
members = ["project_a", "project_b"]
然後,在該目錄下建立 project_a
和 project_b
子專案:
cargo new project_a
cargo new project_b
這樣,你可以在同一個工作空間中編譯和管理多個專案。
為了展示 Cargo 的強大功能,我們來看一個完整的範例專案,它使用了 serde
庫來解析 JSON。
cargo new serde_example
cd serde_example
Cargo.toml
文件:[package]
name = "serde_example"
version = "0.1.0"
edition = "2021"
[dependencies]
serde = "1.0"
serde_json = "1.0"
main.rs
文件:use serde::{Deserialize, Serialize};
use serde_json;
#[derive(Serialize, Deserialize, Debug)]
struct Task {
title: String,
completed: bool,
}
fn main() {
// 序列化:將結構體轉換為 JSON
let task = Task {
title: String::from("完成 Rust 學習"),
completed: false,
};
let serialized = serde_json::to_string(&task).unwrap();
println!("序列化結果:{}", serialized);
// 反序列化:從 JSON 轉換為結構體
let deserialized: Task = serde_json::from_str(&serialized).unwrap();
println!("反序列化結果:{:?}", deserialized);
}
cargo run
輸出結果:
序列化結果:{"title":"完成 Rust 學習","completed":false}
反序列化結果:Task { title: "完成 Rust 學習", completed: false }
Cargo 是 Rust 開發者最重要的工具之一,無論是專案管理、依賴處理、測試還是發佈,Cargo 都能夠輕鬆完成。通過 Cargo.toml
文件,可以輕鬆管理專案的依賴與設定,並通過 Cargo 指令進行專案的建置和測試。